2024-05-27
最后编辑于:2024-06-09
在 Rust 中,子类型是针对生命周期存在的。生命周期是代码的作用域,所以我们可以根据它们相互包含的关系判断他们的继承关系。
生命周期的子类型指: 如果'big: 'small
,那么'big
就是'small
的子类型
可以把'static
看作是所有生命周期的子类型
https://learnku.com/docs/nomicon/2018/38-subtypes-and-variability/4719 https://doc.rust-lang.org/nomicon/subtyping.html
变性是类型构造函数与它的参数相关的一个属性。Rust中的类型构造函数是一个带有无界参数的通用类型
There are three kinds of variance in Rust. Given two types Sub
and Super
, where Sub
is a subtype of Super
:
F
is covariant if F<Sub>
is a subtype of F<Super>
(the subtype property is passed through)F
is contravariant if F<Super>
is a subtype of F<Sub>
(the subtype property is "inverted")F
is invariant otherwise (no subtyping relationship exists)如果类型 T<'a>
是协变的,那么对于生命周期 'a
和 'b
,只要 'a: 'b
('a
比 'b
长),就有 T<'a>: T<'b>
。简单地说,协变意味着可以安全地将生命周期替换为更长的生命周期。
struct Example<'a> {
reference: &'a str,
}
这里,Example<'a>
是协变的,因为如果 'a
的生命周期变长,Example<'a>
仍然是有效的。
逆变性与协变性相反。如果类型 T<'a>
是逆变的,那么对于生命周期 'a
和 'b
,只要 'a: 'b
('a
比 'b
长),就有 T<'b>: T<'a>
。
不变性则意味着类型不能因为生命周期的变化而安全地替换。对于某些类型参数,它们既不是协变的,也不是逆变的,称为不变性。
| |'a|T|U|
|-|-|-|-|
|&'a T
|covariant|covariant||
|&'a mut T
|covariant|invariant||
|Box<T>
||covariant||
|Vec<T>
||covariant||
|UnsafeCell<T>
||invariant||
|Cell<T>
||invariant||
|fn(T) -> U
||contravariant|covariant |
|*const T
||covariant||
|*mut T
||invariant||
https://doc.rust-lang.org/nomicon/subtyping.html